package nl.hanze.shoestring.ui;

import com.toedter.calendar.JDateChooser;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.*;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import javax.swing.*;
import javax.swing.border.LineBorder;
import javax.swing.table.DefaultTableModel;
import nl.hanze.shoestring.domain.Klant;
import nl.hanze.shoestring.domain.Medewerker;
import nl.hanze.shoestring.domain.Persoon;
import nl.hanze.shoestring.logic.Logic;
import nl.hanze.shoestring.logic.Rules;
import nl.hanze.shoestring.logic.Utils;

/**
 * MedewerkerPanel MedewerkerPanel is de GUI waarin de Medewerkers kunnen worden
 * opgevraagd en bewerkt.
 *
 * @author henk
 */
public class MedewerkerPanel extends JPanel {

    private static final long serialVersionUID = 1L;
    Logic logic;
    JPanel pQueryInput, pRecord, pNavigation, pDbGrid;
    JLabel lblZoekSleutel, lblId, lblAchternaam, lblVoornaam, lblAdres, lblPostcode;
    JLabel lblWoonplaats, lblTelefoon, lblEmail, lblGeboortedatum, lblGeslacht, lblRekeningnummer;
    JLabel lblDatum_uitdienst, lblDatum_indienst, lblSalaris, lblGids;
    JTextField txtZoekSleutel, txtId, txtAchternaam, txtVoornaam, txtAdres, txtPostcode, txtWoonplaats;
    JTextField txtTelefoon, txtEmail, txtRekeningnummer, txtSalaris;
    JComboBox<Object> cmbGeslacht;
    JButton butZoeken, butSave, butDelete, butEmpty, butMaakKlant;
    JDateChooser calGeboortedatum, calDatum_uitdienst, calDatum_indienst;
    JCheckBox chkGids;
    JTable table;
    JScrollPane scrollPaneRes;
    DefaultTableModel model;
    Persoon persoonObj = null;
    Medewerker medewerkerObj = null;
    List<Persoon> persoonList;
    List<Medewerker> medewerkerList;
    int heightField = 25;
    int numberOfRows = 12;
    private JLabel lblIsKlant;

    public MedewerkerPanel(Logic logic) {
        this.logic = logic;

        table = new JTable();
        setLayout(new BorderLayout(20, 20));

        // zoek optie  north sectie
        pQueryInput = new JPanel();
        pQueryInput.setLayout(null);
        pQueryInput.setPreferredSize(new Dimension(400, 40));

        lblZoekSleutel = UIHelper.createLabel(lblZoekSleutel = new JLabel(), "Zoeksleutel", 20, 10, 150, heightField, pQueryInput);
        txtZoekSleutel = UIHelper.createTextField(txtZoekSleutel = new JTextField(), "", 170, 10, 300, heightField, pQueryInput);
        txtZoekSleutel.addKeyListener(new KeyAdapter() {

            @Override
            public void keyReleased(KeyEvent e) {
                searchMedewerker();
            }
        });

        butZoeken = UIHelper.createButton(butZoeken = new JButton(), "Zoeken", 480, 10, 100, heightField, pQueryInput);
        butZoeken.addActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        searchMedewerker();
                    }
                });

        // Center sectie, database record detail
        pRecord = new JPanel();
        pRecord.setLayout(null);
        pRecord.setPreferredSize(new Dimension(400, 500));
        pRecord.setBorder(BorderFactory.createLineBorder(Color.blue));

        lblIsKlant = UIHelper.createLabel(lblIsKlant = new JLabel(), "", 500, 10, 120, heightField, pRecord);

        lblId = UIHelper.createLabel(lblId = new JLabel(), "Nummer", 20, 10, 150, heightField, pRecord);
        txtId = UIHelper.createTextField(txtId = new JTextField(), "", 170, 10, 100, heightField, pRecord);

        lblAchternaam = UIHelper.createLabel(lblAchternaam = new JLabel(), "Achternaam", 20, 40, 150, heightField, pRecord);
        txtAchternaam = UIHelper.createTextField(txtAchternaam = new JTextField(), "", 170, 40, 300, heightField, pRecord);

        lblGeboortedatum = UIHelper.createLabel(lblGeboortedatum = new JLabel(), "Geboortedatum", 20, 70, 150, heightField, pRecord);
        calGeboortedatum = UIHelper.createDateChooser(calGeboortedatum = new JDateChooser(), null, 170, 70, 300, heightField, pRecord);

        lblGeslacht = UIHelper.createLabel(lblGeslacht = new JLabel(), "Geslacht", 20, 100, 150, heightField, pRecord);
        cmbGeslacht = UIHelper.createCombo(cmbGeslacht = new JComboBox<>(), 170, 100, 300, heightField, pRecord);
        cmbGeslacht.addItem("M");
        cmbGeslacht.addItem("F");

        lblVoornaam = UIHelper.createLabel(lblVoornaam = new JLabel(), "Voornaam", 20, 130, 150, heightField, pRecord);
        txtVoornaam = UIHelper.createTextField(txtVoornaam = new JTextField(), "", 170, 130, 300, heightField, pRecord);
        // uppercase: rule B001
        txtVoornaam.addKeyListener(new KeyAdapter() {

            @Override
            public void keyReleased(KeyEvent e) {
                if (!txtVoornaam.getText().isEmpty()) {
                    txtVoornaam.setText(Utils.setFirstCharToUpper(txtVoornaam.getText()));
                }
            }
        });

        lblAdres = UIHelper.createLabel(lblAdres = new JLabel(), "Adres", 20, 160, 150, heightField, pRecord);
        txtAdres = UIHelper.createTextField(txtAdres = new JTextField(), "", 170, 160, 300, heightField, pRecord);

        lblPostcode = UIHelper.createLabel(lblPostcode = new JLabel(), "Postcode", 20, 190, 150, heightField, pRecord);
        txtPostcode = UIHelper.createTextField(txtPostcode = new JTextField(), "", 170, 190, 300, heightField, pRecord);
        // rule B004
        txtPostcode.addKeyListener(new KeyAdapter() {

            @Override
            public void keyReleased(KeyEvent e) {
                if (!Rules.checkPostCode(txtPostcode.getText())) {
                    txtPostcode.setBorder(new LineBorder(Color.red));
                } else {
                    txtPostcode.setBorder(new LineBorder(Color.green));
                }
            }
        });

        lblWoonplaats = UIHelper.createLabel(lblWoonplaats = new JLabel(), "Woonplaats", 20, 220, 150, heightField, pRecord);
        txtWoonplaats = UIHelper.createTextField(txtWoonplaats = new JTextField(), "", 170, 220, 300, heightField, pRecord);

        lblTelefoon = UIHelper.createLabel(lblTelefoon = new JLabel(), "Telefoon", 20, 250, 150, heightField, pRecord);
        txtTelefoon = UIHelper.createTextField(txtTelefoon = new JTextField(), "", 170, 250, 300, heightField, pRecord);

        lblEmail = UIHelper.createLabel(lblEmail = new JLabel(), "E-mail adres", 20, 280, 150, heightField, pRecord);
        txtEmail = UIHelper.createTextField(txtEmail = new JTextField(), "", 170, 280, 300, heightField, pRecord);

        // --rechterzijde scherm
        lblRekeningnummer = UIHelper.createLabel(lblRekeningnummer = new JLabel(), "Rekeningnummer", 500, 160, 150, heightField, pRecord);
        txtRekeningnummer = UIHelper.createTextField(txtRekeningnummer = new JTextField(), "", 650, 160, 300, heightField, pRecord);
        // rule B002 + B003
        txtRekeningnummer.addKeyListener(new KeyAdapter() {

            @Override
            public void keyReleased(KeyEvent e) {
                if (!Rules.checkBankAccount(txtRekeningnummer.getText())) {
                    txtRekeningnummer.setBorder(new LineBorder(Color.red));
                } else {
                    txtRekeningnummer.setBorder(new LineBorder(Color.green));
                }
            }
        });

        lblDatum_indienst = UIHelper.createLabel(lblDatum_indienst = new JLabel(), "Datum indienst", 500, 190, 150, heightField, pRecord);
        calDatum_indienst = UIHelper.createDateChooser(calDatum_indienst = new JDateChooser(), null, 650, 190, 150, heightField, pRecord);

        lblDatum_uitdienst = UIHelper.createLabel(lblDatum_uitdienst = new JLabel(), "Datum uitdienst", 500, 220, 150, heightField, pRecord);
        calDatum_uitdienst = UIHelper.createDateChooser(calDatum_uitdienst = new JDateChooser(), null, 650, 220, 150, heightField, pRecord);

        lblSalaris = UIHelper.createLabel(lblSalaris = new JLabel(), "Salaris", 500, 250, 150, heightField, pRecord);
        txtSalaris = UIHelper.createTextField(txtSalaris = new JTextField(), "", 650, 250, 150, heightField, pRecord);

        lblGids = UIHelper.createLabel(lblGids = new JLabel(), "Gids", 500, 280, 150, heightField, pRecord);
        chkGids = UIHelper.createCheckBox(chkGids = new JCheckBox(), "", 650, 280, 150, heightField, pRecord);

        butSave = UIHelper.createButton(butSave = new JButton(), "Opslaan", 170, 340, 120, heightField, pRecord);
        butSave.addActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        if (medewerkerObj != null) {
                            updateRecord(medewerkerObj);
                        } else {
                            addRecord();
                        }
                    }
                });

        butMaakKlant = UIHelper.createButton(butMaakKlant = new JButton(), "Maak klant", 350, 340, 120, heightField, pRecord);
        butMaakKlant.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                KlantDialog k = new KlantDialog();
                k.setModal(true);
                k.setVisible(true);
            }
        });



//        butDelete = UIHelper.createButton(butDelete = new JButton(), "Verwijderen", 350, 340, 120, heightField, pRecord);
//
//        butDelete.addActionListener(
//                new ActionListener() {
//
//                    @Override
//                    public void actionPerformed(ActionEvent e) {
//                        if (persoonObj != null && medewerkerObj != null) {
//                            deleteRecord(persoonObj, medewerkerObj);
//                        }
//                    }
//                });



        butEmpty = UIHelper.createButton(butDelete = new JButton(), "Leeg/Nieuw", 350, 10, 120, heightField, pRecord);


        butEmpty.addActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        emptyAll();
                    }
                });

        pRecord.add(butSave);

        pRecord.add(butDelete);

        // fill tab pane
        add(pRecord, BorderLayout.CENTER);

        add(pQueryInput, BorderLayout.NORTH);

        addTable();

        emptyAll();
    }

    /**
     * Haal informatie uit database en toon in JTable
     */
    private void addTable() {

        // Gridcontainer
        pDbGrid = new JPanel(new BorderLayout(2, 3));

        // scroll pane eigenschappen
        scrollPaneRes = new JScrollPane(table);
        Dimension d = table.getPreferredSize();
        scrollPaneRes.setPreferredSize(new Dimension(d.width, table.getRowHeight() * numberOfRows));

        // navigatie container
        UIHelper.addNavigation(pNavigation = new JPanel(), table, scrollPaneRes, numberOfRows);

        // kolom eigenschappen - breedte
        Object[] headers = {"Nummer", "Naam", "GebDatum", "Voornaam", "Sex", "Adres", "Postcode",
            "Woonplaats", "Telefoon", "Email", "Rekening#", "Indienst", "Uitdienst", "Salaris", "Gids"};
        int[] breedte = {50, 200, 100, 100, 50, 100, 100, 200, 100, 100, 100, 100, 100, 80, 60};

        // tablemodel en eigenschappen instellen, kolombreedte etc
        model = new DefaultTableModel(headers, 0) {

            private static final long serialVersionUID = 1L;

            @Override
            public boolean isCellEditable(int row, int column) {
                return false;
            }

            // rendering van cellen, toont checkbox en juiste datum indien datatype overeenkomstig is
            // null velden veroorzaken fout, standaard maar op String gezet....
            @Override
            public Class getColumnClass(int column) {
                try {
                    return getValueAt(0, column).getClass();
                } catch (java.lang.NullPointerException e) {
                    if (column == 11 || column == 12) {
                        return Date.class;
                    } else {
                        return String.class;
                    }
                }
            }
        };

        table.setModel(model);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        for (int i0 = 0; i0 < breedte.length; i0++) {
            table.getColumnModel().getColumn(i0).setPreferredWidth(breedte[i0]);
        }

        updateTable(true);

        // selecteer row door muisklik    
        table.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseClicked(MouseEvent e) {
                medewerkerObj = medewerkerList.get(table.convertRowIndexToModel(table.getSelectedRow()));
                getRecord(medewerkerObj);
            }
        });

        pDbGrid.add(scrollPaneRes, BorderLayout.CENTER);
        pDbGrid.add(pNavigation, BorderLayout.SOUTH);
        add(pDbGrid, BorderLayout.SOUTH);
    }

    /*
     * Vul detailvelden met geselecteerde rowdata
     */
    private void getRecord(Medewerker medewerkerObj) {
        txtId.setText("" + medewerkerObj.getId());
        txtId.setEditable(false);
        txtAchternaam.setText(medewerkerObj.getPersoon().getAchternaam());
        txtVoornaam.setText(medewerkerObj.getPersoon().getVoornaam());
        txtAdres.setText(medewerkerObj.getPersoon().getAdres());
        txtPostcode.setText(medewerkerObj.getPersoon().getPostcode());
        txtWoonplaats.setText(medewerkerObj.getPersoon().getWoonplaats());
        txtTelefoon.setText(medewerkerObj.getPersoon().getTelefoon());
        txtEmail.setText(medewerkerObj.getPersoon().getEmail());
        calGeboortedatum.setDate(medewerkerObj.getPersoon().getGeboortedatum());
        cmbGeslacht.setSelectedItem(medewerkerObj.getPersoon().getGeslacht());
        txtRekeningnummer.setText("" + medewerkerObj.getPersoon().getRekeningnummer());

        // haal de referentie naar de medewerker
        calDatum_indienst.setDate(medewerkerObj.getDatumIndienst());
        calDatum_uitdienst.setDate(medewerkerObj.getDatumUitdienst());
        txtSalaris.setText(Utils.getValutaFormatFromNumber(medewerkerObj.getSalaris()));
        chkGids.setSelected(medewerkerObj.getGids());

        if (medewerkerObj.getPersoon().getKlant() == null) {
            butMaakKlant.setEnabled(true);
            lblIsKlant.setText("");
        } else {
            butMaakKlant.setEnabled(false);
            lblIsKlant.setText("Is klant");
        }
    }


    /*
     * update record
     */
    private void updateRecord(Medewerker medewerkerObj) {
        Persoon persoonObj = medewerkerObj.getPersoon();
        persoonObj.setAchternaam(txtAchternaam.getText());
        persoonObj.setVoornaam(txtVoornaam.getText());
        persoonObj.setAdres(txtAdres.getText());
        persoonObj.setPostcode(txtPostcode.getText());
        persoonObj.setWoonplaats(txtWoonplaats.getText());
        persoonObj.setTelefoon(txtTelefoon.getText());
        persoonObj.setEmail(txtEmail.getText());
        persoonObj.setGeboortedatum(calGeboortedatum.getDate());
        persoonObj.setGeslacht("" + cmbGeslacht.getSelectedItem());
        persoonObj.setRekeningnummer(Utils.getIntegerValueOrNull(txtRekeningnummer.getText()));

        logic.updatePersoon(persoonObj);


        medewerkerObj.setDatumIndienst(calDatum_indienst.getDate());
        medewerkerObj.setDatumUitdienst(calDatum_uitdienst.getDate());
        medewerkerObj.setSalaris(Utils.getFloatValueOrNull(txtSalaris.getText()));
        medewerkerObj.setGids(chkGids.isSelected());
        logic.updateMedewerker(medewerkerObj);


        updateTable(true);
//        emptyAll();
    }

    /*
     * add new record Persoon + Medewerker
     */
    private void addRecord() {
        persoonObj = new Persoon();
        // persoon
        persoonObj.setAchternaam(txtAchternaam.getText());
        persoonObj.setVoornaam(txtVoornaam.getText());
        persoonObj.setAdres(txtAdres.getText());
        persoonObj.setPostcode(txtPostcode.getText());
        persoonObj.setWoonplaats(txtWoonplaats.getText());
        persoonObj.setTelefoon(txtTelefoon.getText());
        persoonObj.setEmail(txtEmail.getText());
        persoonObj.setGeboortedatum(calGeboortedatum.getDate());
        persoonObj.setGeslacht("" + cmbGeslacht.getSelectedItem());
        persoonObj.setRekeningnummer(Utils.getIntegerValueOrNull(txtRekeningnummer.getText()));
        //       logic.addPersoon(persoonObj);

        // medewerker opslaan

        medewerkerObj = new Medewerker();
        medewerkerObj.setDatumIndienst(calDatum_indienst.getDate());
        medewerkerObj.setDatumUitdienst(calDatum_uitdienst.getDate());
        medewerkerObj.setSalaris(Utils.getFloatValueOrNull(txtSalaris.getText()));
        medewerkerObj.setGids(chkGids.isSelected());
        medewerkerObj.setPersoon(persoonObj);
        logic.addMedewerker(medewerkerObj);

        updateTable(true);
        emptyAll();
    }

    /*
     * delete record Persoon + Medewerker
     */
    private void deleteRecord(Persoon persoonObj, Medewerker medewerkerObj) {
        if (persoonObj != null) {
            logic.deletePersoon(persoonObj);
        }
        if (medewerkerObj != null) {
            logic.deleteMedewerker(medewerkerObj);
        }
        updateTable(true);
        emptyAll();
    }

    /*
     * maak velden leeg en persoontypeObj =null
     */
    private void emptyAll() {
        butMaakKlant.setEnabled(false);
        lblIsKlant.setText("");

        txtId.setEditable(false);
        txtId.setText("");
        txtAchternaam.setText("");
        txtVoornaam.setText("");
        txtAdres.setText("");
        txtPostcode.setBorder(new LineBorder(Color.gray));
        txtPostcode.setText("");
        txtWoonplaats.setText("");
        txtTelefoon.setText("");
        txtEmail.setText("");
        calGeboortedatum.setDate(null);
        cmbGeslacht.setSelectedItem(null);
        txtRekeningnummer.setText("");
        txtRekeningnummer.setBorder(new LineBorder(Color.gray));
        calDatum_indienst.setDate(null);
        calDatum_uitdienst.setDate(null);
        txtSalaris.setText("");
        chkGids.setSelected(false);
        medewerkerObj = null;
    }

    /*
     * maak velden Medewerker leeg
     */
    private void emptyMedewerker() {
        calDatum_indienst.setDate(null);
        calDatum_uitdienst.setDate(null);
        txtSalaris.setText("");
        chkGids.setSelected(false);
    }

    private void updateTable(Boolean refresh) {
        if (refresh) {
            medewerkerList = logic.getMedewerkerList();
        }
        model.setRowCount(0);
        Collections.sort(medewerkerList);

        // data in JTable plaatsen
        for (Medewerker medewerker : medewerkerList) {
            Object[] o = {medewerker.getId(),
                medewerker.getPersoon().getAchternaam(),
                medewerker.getPersoon().getGeboortedatum(),
                medewerker.getPersoon().getVoornaam(),
                medewerker.getPersoon().getGeslacht(),
                medewerker.getPersoon().getAdres(),
                medewerker.getPersoon().getPostcode(),
                medewerker.getPersoon().getWoonplaats(),
                medewerker.getPersoon().getTelefoon(),
                medewerker.getPersoon().getEmail(),
                medewerker.getPersoon().getRekeningnummer(),
                medewerker.getDatumIndienst(),
                medewerker.getDatumUitdienst(),
                medewerker.getSalaris(),
                medewerker.getGids()
            };
            model.addRow(o);
        }
    }

    private void searchMedewerker() {
        medewerkerList = logic.searchMedewerker(txtZoekSleutel.getText());
        updateTable(false);
    }

    class KlantDialog extends JDialog {

        private JLabel lblPaspoortNummer;
        public JTextField txtPaspoortNummer;
        private JLabel lblPolisNummer;
        public JTextField txtPolisNummer;
        private JButton butKlantOpslaan;
        private JButton butklantAnnuleer;
        private final JTextArea txtInfoText;

        public KlantDialog() {
            setSize(500, 300);
            Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
            int w = dim.getSize().width;
            int h = dim.getSize().height;
            setLocation((w - 500) / 2, (h - 300) / 2);
            setLayout(null);


            txtInfoText = new JTextArea("Vul onderstaande velden in om als medewerker deel \n te nemen aan een reis");
            txtInfoText.setLineWrap(true);
            txtInfoText.setBounds(10, 10, 400, 30);
            add(txtInfoText);

            lblPaspoortNummer = new JLabel("Paspoortnummer");
            lblPaspoortNummer.setBounds(10, 50, 120, heightField);
            add(lblPaspoortNummer);

            txtPaspoortNummer = new JTextField();
            txtPaspoortNummer.setBounds(150, 50, 120, heightField);
            add(txtPaspoortNummer);

            lblPolisNummer = new JLabel("Polisnummer");
            lblPolisNummer.setBounds(10, 90, 120, heightField);
            add(lblPolisNummer);

            txtPolisNummer = new JTextField();
            txtPolisNummer.setBounds(150, 90, 120, heightField);
            add(txtPolisNummer);

            butklantAnnuleer = new JButton("Annuleer");
            butklantAnnuleer.setBounds(10, 140, 120, heightField);
            add(butklantAnnuleer);

            butklantAnnuleer.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    setVisible(false);
                }
            });

            butKlantOpslaan = new JButton("Opslaan");
            butKlantOpslaan.setBounds(150, 140, 120, heightField);
            add(butKlantOpslaan);

            butKlantOpslaan.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    maakKlant();
                    setVisible(false);
                }
            });


        }

        private void maakKlant() {
            Klant klantObj = new Klant();
            klantObj.setPaspoortnummer(txtPaspoortNummer.getText());
            klantObj.setPolisnummer(txtPolisNummer.getText());
            klantObj.setPersoon(medewerkerObj.getPersoon());          
            logic.addKlant(klantObj);
            
            medewerkerObj.getPersoon().setKlant(klantObj);
            
//            System.out.println(medewerkerObj.getPersoon().getKlant().getId());
            getRecord(medewerkerObj);

        }
    }
}
